#!/bin/bash

# 部署Spring Boot应用的Shell脚本

# 检查参数是否正确
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
    echo "用法: $0 <应用目录> [环境名称]"
    exit 1
fi

APP_DIR=$1

# 检查应用目录是否存在
if [ ! -d "$APP_DIR" ]; then
    echo "错误：应用目录不存在：$APP_DIR"
    exit 1
fi
# 查找目录中的JAR文件
JAR_FILES=("$APP_DIR"/*.jar)
JAR_COUNT=${#JAR_FILES[@]}
echo "找到Jar包 $JAR_FILES"



# 验证JAR文件数量
if [ $JAR_COUNT -eq 0 ]; then
    echo "错误：在目录 $APP_DIR 中未找到任何JAR文件。"
    exit 1
elif [ $JAR_COUNT -gt 1 ]; then
    echo "错误：在目录 $APP_DIR 中找到多个JAR文件，请确保只有一个。"
    echo "找到的JAR文件："
    printf '%s\n' "${JAR_FILES[@]}"
    exit 1
fi

APP_JAR=${JAR_FILES[0]}
APP_NAME=$(basename $APP_JAR)
echo "准备执行jar包 $APP_NAME "
PROFILE=${2:-""}
# 函数：停止正在运行的应用
stop_application() {
    echo "正在检查应用是否正在运行..."

    # 使用jps查找包含指定jar包名称的Java进程
    jps -l | grep "$APP_NAME" | while read pid app
    do
        echo "正在停止应用 [PID: $pid, APP: $app]"
        kill $pid
        # 等待最多5秒直到进程终止
        for i in {1..5}; do
            if ps -p $pid > /dev/null; then
                sleep 1
            else
                break
            fi
        done
        # 如果仍然存在则强制终止
        if ps -p $pid > /dev/null; then
            echo "强制终止应用 [PID: $pid]"
            kill -9 $pid
        fi
    done
}

# 函数：启动应用
start_application() {

if [ -n "$PROFILE" ]; then

JAVA_OPTS="--spring.profiles.active=$PROFILE"

else

JAVA_OPTS=""

fi

    echo "准备执行jar包 $APP_JAR"
    echo "正在启动应用,当前运行环境为 [$PROFILE]"
    nohup java -jar $APP_JAR $JAVA_OPTS  > /dev/null 2>&1 &
    echo "应用已启动，输出重定向到nohup.out"
}

# 主执行流程
stop_application
# 等待2秒确保进程完全停止
sleep 2
start_application

# 验证启动结果
sleep 10
echo "启动验证:"
jps -l | grep "$APP_NAME" | while read npid napp
do
 echo "应用启动成功 [PID: $npid,APP: $napp]"
done
